home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / MyMacBinary.p < prev    next >
Encoding:
Text File  |  1994-11-06  |  4.0 KB  |  148 lines  |  [TEXT/PJMM]

  1. unit MyMacBinary;
  2.  
  3. interface
  4.  
  5.     uses
  6.         CalcCRC;
  7.  
  8.     const
  9.         macbin_folder_ftype = 'fold';
  10.         macbin_folder_creator_start = -1; { Should be OSType(-1), damn TP! }
  11.         macbin_folder_creator_end = -2;
  12.  
  13.     type
  14.         MBpacket = packed array[1..128] of byte;
  15.  
  16.     type
  17.         MBIIStartHeader = packed record
  18.                 name: str63;
  19.                 ftype: OSType;
  20.                 fcreator: OSType;
  21.                 flags_high: byte;
  22.                 zero1: byte;
  23.                 flocation: Point;
  24.                 windowID: integer; {? - ignore }
  25.                 protected: byte; { low order bit - ignore}
  26.                 zero2: byte;
  27.                 dlen: longInt;
  28.                 rlen: longInt;
  29.                 create_date: longInt;
  30.                 mod_date: longInt;
  31.                 clen: integer;
  32.                 flags_low: byte;
  33.             end;
  34.         MBIIHeader = packed record
  35.                 version: signedByte;
  36.                 MBIIStart: signedByte;
  37.                 space: packed array[2..115] of byte;
  38.                 total_unpack_len: longInt;{ignore}
  39.                 second_header_len: integer;{ignore}
  40.                 versionII: byte;
  41.                 minversionII: byte;
  42.                 crc: integer;
  43.                 processorID: integer; {ignore}
  44.             end;
  45.         packet_type = (PT_None, PT_File, PT_StartBlock, PT_EndBlock);
  46.  
  47.     function ValidateMBHeader (var header: MBIIHeader; handle2plus: boolean): packet_type;
  48.     procedure CatInfo2MBHeader (var pb: CInfoPBRec; var header: MBIIHeader; dtdbr: integer; var comment: str255);
  49.  
  50. implementation
  51.  
  52.     uses
  53.         MyMemory, MyDesktopDB;
  54.  
  55.     function ValidateMBHeader (var header: MBIIHeader; handle2plus: boolean): packet_type;
  56.         var
  57.             ocrc, i: integer;
  58.             typ: packet_type;
  59.             start: MBIIStartHeader;
  60.     begin
  61.         BlockMove(@header.MBIIStart, @start, SizeOf(start));
  62.         typ := PT_None;
  63.         with header do begin
  64.             if (version <= ord(handle2plus)) & (MBpacket(header)[75] = 0) then begin
  65.                 ocrc := 0;
  66.                 for i := 1 to 124 do begin
  67.                     CalcMBCRC(ocrc, MBpacket(header)[i]);
  68.                 end;
  69.                 if ocrc = MBIIHeader(header).crc then begin
  70.                     if (version = 1) & (start.ftype = macbin_folder_ftype) & ((start.fcreator = OSType(macbin_folder_creator_start)) or (start.fcreator = OSType(macbin_folder_creator_end))) then begin
  71.                         if start.fcreator = OSType(macbin_folder_creator_start) then
  72.                             typ := PT_StartBlock
  73.                         else
  74.                             typ := PT_EndBlock;
  75.                     end
  76.                     else begin
  77.                         typ := PT_File;
  78.                     end;
  79.                 end
  80.                 else begin { Assume its a valid MacBinary I file }
  81.                     if (version = 0) then begin
  82.                         MBpacket(header)[101] := 0; { Zero out the flags low_byte }
  83.                         total_unpack_len := 0;
  84.                         second_header_len := 0;
  85.                         versionII := 129;
  86.                         minversionII := 129;
  87.                         crc := 0;
  88.                         processorID := 0;
  89.                         typ := PT_File;
  90.                     end;
  91.                 end;
  92.             end;
  93.         end;
  94.         if typ in [PT_StartBlock, PT_File] then begin
  95.             if (MBpacket(header)[2] < 1) | (MBpacket(header)[2] > 31) then begin
  96.                 typ := PT_None;
  97.             end;
  98.         end;
  99.         ValidateMBHeader := typ;
  100.     end;
  101.  
  102.     procedure CatInfo2MBHeader (var pb: CInfoPBRec; var header: MBIIHeader; dtdbr: integer; var comment: str255);
  103.         var
  104.             start: MBIIStartHeader;
  105.             fs: FSSpec;
  106.             folder: boolean;
  107.             ocrc, i: integer;
  108.     begin
  109.         folder := BAND(pb.ioFlAttrib, $10) <> 0;
  110.         MFillLong(@header, SizeOf(header), 0);
  111.         MFill(@start, SizeOf(start), 0);
  112.         header.version := ord(folder);
  113.         header.versionII := 129 + ord(folder);
  114.         header.minversionII := 129 + ord(folder);
  115.         start.name := pb.ioNamePtr^;
  116.         start.flags_high := BAND(BSR(pb.ioFlFndrInfo.fdFlags, 8), $FF);
  117.         start.flags_low := BAND(pb.ioFlFndrInfo.fdFlags, $FF);
  118.         start.flocation := pb.ioFlFndrInfo.fdLocation;
  119.         start.windowID := pb.ioFlFndrInfo.fdFldr;
  120.         start.create_date := pb.ioFlCrDat;
  121.         start.mod_date := pb.ioFlMdDat;
  122.  
  123.         if folder then begin
  124.             start.ftype := macbin_folder_ftype;
  125.             start.fcreator := OSType(macbin_folder_creator_start);
  126.             start.dlen := 0;
  127.             start.rlen := 0;
  128.         end
  129.         else begin
  130.             start.ftype := pb.ioFlFndrInfo.fdType;
  131.             start.fcreator := pb.ioFlFndrInfo.fdCreator;
  132.             start.dlen := pb.ioFlLgLen;
  133.             start.rlen := pb.ioFlRLgLen;
  134.         end;
  135.  
  136.         fs.vRefNum := pb.ioVRefNum;
  137.         fs.parID := pb.ioFlParID;
  138.         fs.name := pb.ioNamePtr^;
  139.         GetDTDBComment(dtdbr, fs, comment);
  140.         start.clen := length(comment);
  141.         BlockMove(@start, @header.MBIIStart, SizeOf(start));
  142.         ocrc := 0;
  143.         for i := 1 to 124 do
  144.             CalcMBCRC(ocrc, MBPacket(header)[i]);
  145.         header.crc := ocrc;
  146.     end;
  147.  
  148. end.